package com.data.service;

import cn.hutool.core.collection.CollUtil;
import com.data.pojo.StockCode;
import com.data.util.StockUtil;
import com.google.gson.Gson;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * @Author Str
 * @Date 2022/2/12 15:06
 * @Description :股票代码服务
 */
@Service
public class StockCodeService {
    private List<StockCode> stockCodes = new ArrayList<>();

    @Autowired
    private StockUtil stockUtil;

    @Autowired
    RedisTemplate redisTemplate;//操作k-v对象的

    /**
     * 根据股票代码获取一个StockCode对象
     * 将数据提交到redis
     *
     * @return com.data.pojo.StockCode
     */
    public Long putStockCode() {
        return redisTemplate.opsForSet().add("all_stock_code", stockUtil.getStockCode());
    }

    /**
     * 从redis中获取StockCode数据
     *
     * @return java.util.List<com.data.pojo.StockCode>
     */
    public Map<String, StockCode> getStockCode() {
        Gson gson = new Gson();
        Map<String, StockCode> map = new HashMap<>();
        // 根据all_stock_code key获取
        Set<HashMap<String, String>> allStockCode = redisTemplate.opsForSet().members("all_stock_code");
        // 取一条，本来也就一条
        for (HashMap<String, String> stringStockCodeHashMap : allStockCode) {
            // redis中存的是HashMap<String, String>
            // 因为直接存实体类对象是直接将对象序列化放进去的
            // 这是为了防止不同微服务取数据反序列化时，类路径不匹配
            for (String key : stringStockCodeHashMap.keySet()) {
                StockCode stockCode = gson.fromJson(stringStockCodeHashMap.get(key), StockCode.class);
                map.put(key, stockCode);
            }
            return map;
        }
        return null;
    }

    /**
     * 从redis中获取数据，返回值类型是LinkedHashMap
     *
     * @return java.util.List<com.data.pojo.StockCode>
     */
    public List<StockCode> fresh() {
        return CollUtil.toList();
    }

    /**
     * 根据key删除redis中对应的数据
     *
     * @return void
     */
    public void remove() {
        redisTemplate.delete("all_stock_code");
    }
}
